from django.views import View
from django.http import JsonResponse
import json
from django.core.paginator import Page,Paginator
from rest_framework.viewsets import ModelViewSet
from rest_framework.generics import ListAPIView
from apps.goods.models import SPUSpecification, SPU

# 规格表里面存在很多的增删改查的操作
# 而这些的增删改查的操作 都封装在一个视图集里面
from apps.meiduo_admin.serializers.specs import SpeceModelSerializer, SpuSimpleSerializer, SpecOptionSerializer
from apps.meiduo_admin.utils.pagination import MeiduoPagination


# 对商品的spu规格进行一系列的增删改查
from apps.meiduo_admin.utils.token_valid import LoginValidMixin


class SpecsViewSet(ModelViewSet):
    queryset = SPUSpecification.objects.all()
    serializer_class = SpeceModelSerializer
    pagination_class = MeiduoPagination


# 在增加的地方里面存在着 对于规格表的获取 只是获取部分的id name
class SpuSimpleView(ListAPIView):
    queryset = SPU.objects.all()
    serializer_class = SpuSimpleSerializer

#获取SPU商品的规格信息，通过路径上的传递到当前SPU的id得到相应的规格信息
#管理系统 通过返回的数据得到显示出对应的按钮选择
class SpecOptionsView(ListAPIView):
    # queryset =
    #路由里面存在有路径参数  同时需要接收路劲参数进行  故改成方法进行接收查询集
    def get_queryset(self):
        # self.kwargs===>获取路径中的关键字参数
        pk = self.kwargs.get('pk')
        # 根据spu的id值关联过滤查询出规格信息
        return SPUSpecification.objects.filter(spu_id = pk)
    serializer_class = SpecOptionSerializer




#采用纯django进行操作商品规格的操作
#LoginValidMixin  里面封装了dispach方法 在dispach里面增加了身份验证
#在token_valid里面验证了用户的有效性  然后又采用super.dispach方法
#在dispatch后续的操作完成时 同时又采用post,get方法操作

# class SpecsView(LoginValidMixin,View):
class SpecsView(View):
    def get(self,request):
        queryset = SPUSpecification.objects.all()  #查询多条
        #?page=2&pagesize=10   前端请求数据  后端需要接收
        page_size = int(request.GET.get('pagesize'))
        print(type(page_size),page_size)
        page_index = int(request.GET.get('page'))

        #分页
        #object_list列表、元组、QuerySet或具有count()或
        # __len__()方法的其它可切片的对象   queryset
        #per_page 每个页面上包含的元素的最大数目   page_size
        paginator = Paginator(queryset,page_size) #f分页器对象
        # 返回在提供的下标处Page对象   当前页的对象
        page = paginator.page(page_index)

        #遍历  将当前页的对象转换成为字典
        spec_list = []
        for spec in page:
            spec_list.append({
                'id':spec.id,
                'name':spec.name,
                'spu':spec.spu.name,
                'spu_id':spec.spu_id
            })
        return JsonResponse({
            'counts':paginator.count,
            'lists':spec_list,
            'page':page_index,
            'pages':paginator.num_pages,
            'pagesize':page_size
        })
    def post(self,request):
        #创建 接收
        json_dict = json.loads(request.body.decode())
        name = json_dict.get('name')
        spu_id = json_dict.get('spu_id')
        #验证
        if not all([name,spu_id]):
            return JsonResponse({'msg':'数据不完整'},stutas = 400)
        if SPU.objects.filter(pk=spu_id).count()<=0:
            return JsonResponse({'msg':'spu编号无效'},status=400)
        instance = SPUSpecification.objects.create(name = name,spu_id=spu_id)
        #响应
        return JsonResponse({
            'id':instance.id,
            'name':instance.name,
            'spu':instance.spu.name,
            'spu_id':instance.spu_id
        },status=201)

class SpecView(View):
    def get(self,request,pk):
        instance = SPUSpecification.objects.get(pk= pk)
        # 响应
        return JsonResponse({
            'id': instance.id,
            'name': instance.name,
            'spu': instance.spu.name,
            'spu_id': instance.spu_id
        })
    def put(self,request,pk):
        instance = SPUSpecification.objects.get(pk=pk)
        json_dict = json.loads(request.body.decode())
        name = json_dict.get('name')
        spu_id = json_dict.get('spu_id')

        # 验证
        if not all([name, spu_id]):
            return JsonResponse({'msg': '数据不完整'}, stutas=400)
        if SPU.objects.filter(pk=spu_id).count() <= 0:
            return JsonResponse({'msg': 'spu编号无效'}, status=400)
        instance.name = name
        instance.spu_id = spu_id
        instance.save()
        # 响应
        return JsonResponse({
            'id': instance.id,
            'name': instance.name,
            'spu': instance.spu.name,
            'spu_id': instance.spu_id
        }, status=201)
    def delete(self,request,pk):
        instance = SPUSpecification.objects.get(pk=pk)
        instance.delete()
        return JsonResponse({}, status=204)

